package until;

import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JdbcUntil {
	private static Connection connection;
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/test929";
			String name = "root";
			String password = "maihao1122";
			connection = DriverManager.getConnection(url, name, password);
		} catch (ClassNotFoundException | SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public static  Connection getConn() {
		return connection;
	}

	/**
	 *
	 * @param sql 要进行的数据库语句
	 * @param params 不定向参数，将employee对象的属性传过来，由于不知道参数的个数是多少，所以用了不定向参数
	 * @return
	 * @throws SQLException
	 */
	public static int dml(String sql,Object...params) throws SQLException {
		PreparedStatement pstm=connection.prepareStatement(sql);
		if(params!=null) {
			for(int i =0;i<params.length;i++) {
				pstm.setObject(i+1,params[i]);
			}
			return pstm.executeUpdate();
		}
		return -1;
	}

	/**
	 *
	 * @param sql
	 * @param tClass 对应的实体类类型的字节码文件对象，Employee.class
	 * @param params 匹配问号
	 * @return
	 * @param <T> 泛型对应的实体类类型
	 * @throws Exception
	 */
	public static <T> List<T> dqlMany(String sql,Class<T> tClass,Object...params) throws Exception {
		PreparedStatement pstm=connection.prepareStatement(sql);
		if(params!=null) {
			for (int i = 0; i < params.length; i++) {
				pstm.setObject(i + 1, params[i]);
			}
		}
		List<T> list = new ArrayList<>();
		ResultSet resultSet=pstm.executeQuery();
		//获取元数据 元数据中可以拿到列的数量
		ResultSetMetaData metaData=resultSet.getMetaData();
		//获取列的数量
		int column=metaData.getColumnCount();
		while(resultSet.next()) {
			/*
			一行中需要动态的获取数据
			列的数量？通过元数据来获取
			列的类型？resualt.getObject
			列的名称？metaData.getColumnName (列的下标)
			 */
			T t=tClass.newInstance();
			for(int i = 0;i< column;i++) {
				String columnName= metaData.getColumnName(i+1);
				Object columnValue=resultSet.getObject(columnName);
				String setMethodName = "set"+String.valueOf(columnName.charAt(0)).toUpperCase()+columnName.substring(1);
				Method setMethod=null;
				if (columnValue.getClass().equals(java.sql.Date.class)){
					setMethod = tClass.getMethod(setMethodName, java.util.Date.class);
				}else if(columnValue.getClass().equals(java.math.BigDecimal.class)){
					setMethod = tClass.getMethod(setMethodName, java.lang.Double.class);
					columnValue = ((BigDecimal)columnValue).doubleValue();
				}else{
					setMethod = tClass.getMethod(setMethodName, columnValue.getClass());
				}
				setMethod.invoke(t,columnName);
			}
			list.add(t);
		}
		return list;
	}
}
